Chefのテストツール kitchen-ec2を使う – 導入、チュートリアル
こんにちは。望月です。
最近、社内で利用しているchefクックブックの数が増えてきています。それ自体は非常に良いことなのですが、そろそろ本腰入れてChefのテストを書いていかなければならないと思うようになりました。
その第一歩として、test-kitchenとkitchen-ec2を利用して、chefの実行からテストまでを自動化することを試してみました。今日はまず、インストールから実行までの手順をまとめてみます。
test-kitchenとは
test-kitchenは、Chefで記述されたレシピの実行・テストを補助するためのツールセットです。
test-kitchenの特徴は、Chefの実行を行うために起動するVMの、起動先のクラウドや仮想化ツールをプラグインで選択できることです。VagrantやDocker、EC2などを起動先として選択できます。
弊社がAWS上にLinuxサーバを構築する際にはAmazon Linuxがよく用いられますが、Amazon LinuxはEC2上で動作させないと様々な問題がある *1ので、今回はtest-kitchenからEC2を扱うためのkitchen-ec2を利用して、test-kitchenの使い方をひと通り試してみます。
インストール
手元のマシンはMac OS X 10.9にて実行しています。まず、test-kitchenとkitchen-ec2をインストールします。
$ gem install test-kitchen $ kitchen version Test Kitchen version 1.2.1 $ gem install kitchen-ec2
次に、chefのクックブックが存在するリポジトリに移動し、kitchenを利用するための準備を行います。今回はApacheのクックブックで検証しています。
$ cd path/to/cookbook_dir $ kitchen init --driver=kitchen-ec2 create .kitchen.yml create test/integration/default create .gitignore append .gitignore append .gitignore run gem install kitchen-ec2 from "." Successfully installed kitchen-ec2-0.8.0 1 gem installed
kitchen initを利用することにより、test-kitchenで利用するファイル群が生成されます。生成された.kitchen.ymlがtest-kitchenの設定ファイルになります。
--driverオプションで、VMの起動先(利用するkitchenプラグイン)を指定します。今回はkitchen-ec2の利用が目的なのでその通り入力しています。
Amazon Linuxをkitchen-ec2で利用するために、Amazon Linux最新版のAMI IDを設定ファイルに記載する必要があります。kitchen-ec2のREADMEを参考に、以下の様なkitchen.ymlを作成しました。
driver: name: ec2 aws_access_key_id: <%= ENV['AWS_ACCESS_KEY'] %> aws_secret_access_key: <%= ENV['AWS_SECRET_KEY'] %> aws_ssh_key_id: <%= ENV['AWS_KEY_PAIR'] %> ssh_key: <%= File.expand_path('~/.ssh/#{ENV['AWS_KEY_PAIR']}.pem') %> security_group_ids: ["sg-abcd1234"] region: ap-northeast-1 availability_zone: ap-northeast-1a require_chef_omnibus: true provisioner: name: chef_solo platforms: - name: AmazonLinux-201403 driver: image_id: ami-c9562fc8 username: ec2-user suites: - name: default run_list: - recipe[apache24::default] attributes:
.kitchen.ymlはerb形式をサポートしているので、上に示したような形で変数を埋め込むことが可能です。アクセスキーやシークレットキー、キーペアは環境変数から読み込むようにしています。
これでkitchenのセットアップは完了です。kitchen createコマンドをInstance Nameを引数につけて実行することで、レシピを適用する仮想マシンを起動することが出来ます。Instance Nameはkitchen listコマンドで確認できます。
mochizukimasao@HL00044 $ kitchen list Instance Driver Provisioner Last Action default-AmazonLinux-201403 Ec2 ChefSolo <Not Created>
Instance Nameは.kitchen.ymlに記述されたplatform nameとsuite nameを基に生成されます。今回はdefault-AmazonLinux-201403がInstance Nameとなります。
さて、それではkitchen createを実行してみます。EC2インスタンスが起動します。
mochizukimasao@HL00044 $ kitchen create default-AmazonLinux-201403 -----> Starting Kitchen (v1.2.1) -----> Creating <default-AmazonLinux-201403>... EC2 instance <i-xxxxxxxx> created. ............... (server ready) Waiting for ec2-xx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com:22... <snip> (ssh ready)\n Finished creating <default-AmazonLinux-201403> (1m53.79s). -----> Kitchen is finished. (1m54.82s)
起動後は、kitchen convergeコマンドを実行することで、リモートのVMに対して以下のことが実行されます。
- Instanceにchef-soloのインストール
- Instanceにrecipeのアップロード
- recipeの実行
$ kitchen converge default-AmazonLinux-201403 -----> Starting Kitchen (v1.2.1) -----> Converging <default-AmazonLinux-201403>... Preparing files for transfer Preparing current project directory as a cookbook Removing non-cookbook files before transfer Preparing data bags Preparing nodes -----> Installing Chef Omnibus (true) <snip> Chef Client finished, 8/8 resources updated in 20.486205403 seconds Finished converging <default-AmazonLinux-201403> (0m50.08s). -----> Kitchen is finished. (0m51.21s) # 状態の確認 $ kitchen list Instance Driver Provisioner Last Action default-AmazonLinux-201403 Ec2 ChefSolo Converged
kitchen listコマンドを実行すると、今のInstanceの状態が取得できます。kitchen convergeを実行した後は[Last Action]が[Converged]になっていることが確認できます。
また、Instanceの終了にはkitchen destroy
まとめ
今回はChefのテストツールであるtest-kitchenとそのEC2用プラグインであるkitchen-ec2の導入と動作確認を行いました。今まで手作業で実施していたEC2の起動やknife solo prepareのchefを実行するための前準備をいい感じにラッピングしてくれています。
ですが、今回の内容は、単純にEC2インスタンスを起動してchefレシピを実行しただけです。
test-kitchenを導入した真の目的である、テスト実行については次回以降のブログにて書きます。
参考資料
- test-kitchen + kitchen-docker と serverspec で cookbook をテストする - ようへいの日々精進 XP
- test-kitchenのつかいかた : Qiita
脚注
- yumのamznリポジトリが利用できない等。 ↩